home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
tools
/
rb
/
jlcd100.lzh
/
TNB_FSW
/
KBMS001.Lzh
/
KBMOUSE.s
< prev
next >
Wrap
Text File
|
1997-09-10
|
13KB
|
722 lines
.include tnb.mac
.include iocscall.mac
.include doscall.mac
StartStatio:*******************常駐部
SS:
jmp init-SS(a4)
head:
HEAD1 = '*KBM'
HEAD2 = 'S001'
.dc.l HEAD1
.dc.l HEAD2
.even
st:
MFP: *=========================================
* ($4C)[$0130]
* 受信パッファー割り込み
*
MFP_ = $0130.w
MFP__ = $004C
bclr.b #4,IMRA *キー入力割り込みマスククリア
movem.l d0/d1/d7/a1,-(sp)
move.b $00E8802F,d7
cmpi.b #$5A+$80,d7
bne MFP_L1
*=========== [かな]が離された!
tst.w KeyMode
beq MFP_ON * KEY MODEだった
*------ KEY モードへ
clr.w KeyMode
clr.b ADDX
clr.b ADDY
clr.b ADDB
*----- LED を消す
@@: tst.b $00e8802d * データがCPU側にたまっていないか。
bpl @b
move.b $0810.w,d0 * 本機の LED の状態
not.b d0
ori.b #%1000_0100,d0 * LED モード設定
move.b d0,$00e8802f * キーボードコマンド
@@: tst.b $00e8802d * データがCPU側にたまっていないか。
bpl @b
moveq #$54,d0
move.b d0,$00e8802f * キーボードコマンド
bra MFP_END * 終わる
MFP_ON:
*-------- MS モードへ
btst.b #0,$80E.w
beq MFP_L2 * SHIFT は押されていない
move.w #1,KeyMode * MS MODE に
* clr.l $800.w
* clr.l $804.w
* clr.l $808.w
* clr.l $80C.w
bra MFP_END * 終わる
*----- LED を消す
@@: tst.b $00e8802d * データがCPU側にたまっていないか。
bpl @b
move.b #%1111_1111,d0 * LED モード設定
move.b d0,$00e8802f * キーボードコマンド
@@: tst.b $00e8802d * データがCPU側にたまっていないか。
bpl @b
bra MFP_END * 終わる
MFP_L1:
cmpi.b #$5A,d7
bne MFP_L2
*========== [かな]が押された
tst.w KeyMode
beq @f
*---- MS モード
bra MFP_END
@@:
btst.b #0,$80E.w
beq MFP_L2 * SHIFT は押されていない
bra MFP_END * 終わる
MFP_L2:
*============
tst.w KeyMode
bne MFP_L3 * MS MODE なので
MFP_EE::
movem.l (sp)+,d0/d1/d7/a1
bset.b #4,IMRA *キー入力割り込みマスクセット
MFP_JMP:
jmp 0.l
MFP_END::
movem.l (sp)+,d0/d1/d7/a1
bset.b #4,IMRA *キー入力割り込みマスクセット
rte
MFP_L3
*======== マウスエミュ
move.b d7,d0
andi.b #$7F,d0
cmpi.b #$72,d0 * [OPT1]
beq MFP_SFT
cmpi.b #$2C,d0 * [C]
beq MFP_SFT
cmpi.b #$72,d0
beq MFP_SFT
cmpi.b #$55,d0 * [XF1]
beq MFP_XF1
cmpi.b #$56,d0 * [XF2]
beq MFP_XF2
cmpi.b #$2A,d0 * [Z]
beq MFP_XF1
cmpi.b #$2B,d0 * [X]
beq MFP_XF2
cmpi.b #$3B,d0 * カーソル
bcs MFP_END
cmpi.b #$3E+1,d0 * カーソル
bcs MFP_CUR
move.b d7,d0
bmi MFP_EE
bra MFP_END
MFP_SFT:
moveq #5,d0
bra @f
MFP_XF2:
moveq #7,d0
bra @f
MFP_XF1:
moveq #6,d0
bra @f
MFP_CUR:
subi.b #$3B,d0
@@:
btst #7,d7
bne @f
*---- 押された
bset.b d0,CURSFT
bra 1f
@@: *---- 離された
bclr.b d0,CURSFT
1:
cmpi.b #$72,d0 * OPT1
beq MFP_EE
cmpi.b #$2C,d0 * [C]
beq MFP_EE
bra MFP_END * 終わる
CURSFT:
.dc.b 0 *XF1 XF2 OP1 0 ↓ → ↑ ←
.even * 55 56 70 0 3B 3C 3D 3E
ADDX:
.dc.b 0
ADDY:
.dc.b 0
ADDB:
.dc.b 0 *--LR:---- と入っている
.even
IOCS5: *=========================================
* ($105)[$0414]
* IOCS キー入力
*
IOCS5_ = $0414.w
movem.l d0/d1/d7/a1,-(sp)
move.b d1,d7
cmpi.b #$5A+$80,d7
bne IO5_L1
*=========== [かな]が離された!
tst.w KeyMode
beq IO5_ON * KEY MODEだった
*------ KEY モードへ
clr.w KeyMode
clr.b ADDX
clr.b ADDY
clr.b ADDB
*----- LED を消す
@@: tst.b $00e8802d * データがCPU側にたまっていないか。
bpl @b
move.b $0810.w,d0 * 本機の LED の状態
not.b d0
ori.b #%1000_0100,d0 * LED モード設定
move.b d0,$00e8802f * キーボードコマンド
@@: tst.b $00e8802d * データがCPU側にたまっていないか。
bpl @b
moveq #$54,d0
move.b d0,$00e8802f * キーボードコマンド
bra IO5_END * 終わる
IO5_ON:
*-------- MS モードへ
btst.b #0,$80E.w
beq IO5_L2 * SHIFT は押されていない
move.w #1,KeyMode * MS MODE に
* clr.l $800.w
* clr.l $804.w
* clr.l $808.w
* clr.l $80C.w
bra IO5_END * 終わる
*----- LED を消す
@@: tst.b $00e8802d * データがCPU側にたまっていないか。
bpl @b
move.b #%1111_1111,d0 * LED モード設定
move.b d0,$00e8802f * キーボードコマンド
@@: tst.b $00e8802d * データがCPU側にたまっていないか。
bpl @b
bra IO5_END * 終わる
IO5_L1:
cmpi.b #$5A,d7
bne IO5_L2
*========== [かな]が押された
tst.w KeyMode
beq @f
*---- MS モード
bra IO5_END
@@:
btst.b #0,$80E.w
beq IO5_L2 * SHIFT は押されていない
bra IO5_END * 終わる
IO5_L2:
*============
tst.w KeyMode
bne IO5_L3 * MS MODE なので
IO5_EE::
movem.l (sp)+,d0/d1/d7/a1
IOCS5_JMP:
jmp 0.l
IO5_END::
movem.l (sp)+,d0/d1/d7/a1
rts
IO5_L3
*======== マウスエミュ
move.b d7,d0
andi.b #$7F,d0
cmpi.b #$72,d0 * [OPT1]
beq IO5_SFT
cmpi.b #$2C,d0 * [C]
beq IO5_SFT
cmpi.b #$72,d0
beq IO5_SFT
cmpi.b #$55,d0 * [XF1]
beq IO5_XF1
cmpi.b #$56,d0 * [XF2]
beq IO5_XF2
cmpi.b #$2A,d0 * [Z]
beq IO5_XF1
cmpi.b #$2B,d0 * [X]
beq IO5_XF2
cmpi.b #$3B,d0 * カーソル
bcs IO5_END
cmpi.b #$3E+1,d0 * カーソル
bcs IO5_CUR
move.b d7,d0
bmi IO5_EE
bra IO5_END
IO5_SFT:
moveq #5,d0
bra @f
IO5_XF2:
moveq #7,d0
bra @f
IO5_XF1:
moveq #6,d0
bra @f
IO5_CUR:
subi.b #$3B,d0
@@:
btst #7,d7
bne @f
*---- 押された
bset.b d0,CURSFT
bra 1f
@@: *---- 離された
bclr.b d0,CURSFT
1:
cmpi.b #$72,d0 * OPT1
beq IO5_EE
cmpi.b #$2C,d0 * [C]
beq IO5_EE
bra IO5_END * 終わる
TIMC: *=========================================
* ($45)[$0114]
* TIMC割り込み
*
TIMC_ = $0114.w
TIMC__ = $0045
tst.w KeyMode
beq TIMC_L2
*-------
movem.l d0/d1,-(sp)
*===== CURSFT からマウスの移動値を用意する
move.b CURSFT(pc),d0
moveq #3,d1
btst #5,d0
beq @f
moveq #1,d1
@@: *---- 左
btst #0,d0
beq @f
sub.b d1,ADDX
@@: *---- 上
btst #1,d0
beq @f
sub.b d1,ADDY
@@: *---- 右
btst #2,d0
beq @f
add.b d1,ADDX
@@: *---- 下
btst #3,d0
beq @f
add.b d1,ADDY
@@: *---- XF2
btst #6,d0
beq @f
ori.b #$01,ADDB *--LR:----
@@: *---- XF1
btst #7,d0
beq @f
ori.b #$02,ADDB *--LR:----
@@:
movem.l (sp)+,d0/d1
*-------
subq.w #1,TIMC_C1
bpl TIMC_L2
*---------
move.l d0,-(sp)
move.w #20,TIMC_C1 * 50/100s ごと・・
tst.b $00e8802d *データがCPU側にたまっていないか。
bpl 9f
*move.b tar810(pc),d0
*not.b d0
*bset #7,d0
move.b #$FF,d0
*or.b #$03,d0 * [かな][ローマ] LED 消灯
eori.b #$FF,TIMC_C2
beq @f
andi.b #$FC,d0 * [かな][ローマ] LED 点灯
@@:
move.b d0,$00e8802f * キーボードコマンド
* [コード]LED は BG で点滅させる!
9:
move.l (sp)+,d0
TIMC_L2:
TIMC_JMP:
jmp 0.l
MSD: *---------------------------
* ($24D)[$0934] マウスエミュ
* マウスデータ変更
* a1にワークのアドレスがはいる
MSD_ = $0934.w
movem.l d0-d3/a0-a3,-(sp)
lea Data2(pc),a3
move.b ADDB(pc),d1
or.b d1,(a1)
move.b ADDX(pc),d2
add.b d2,1(a1) *X
move.b ADDY(pc),d3
add.b d3,2(a1) *Y
clr.b ADDX
clr.b ADDY
clr.b ADDB
****** TEMCALLワーク書き込み
tst.b 3(a3)
beq @f
clr.l (a3)
@@: or.b d1,(a3)
add.b d2,1(a3)
add.b d3,2(a3)
movem.l (sp)+,d0-d3/a0-a3
MSD_JMP:
jmp 0.l
MS_SEL: *-----------------------------
* ($17B)[$05EC]
* IOCS $7B MS_SEL
*
MS_SEL_ = $05EC.w
cmpi.w #$105,d1 *KEY B.
beq MSS_LL
MS_SEL_JMP:
jmp 0.l
MSS_LL:
move.l #'TEMC',d0
rts
MS_LIMIT:*-----------------------------
* ($177)[$05DC]
* IOCS $77 MS_LIMIT
*
MS_LIMIT_ = $05DC.w
cmpi.l #'TEMC',d1
beq @f
MS_LIMIT_JMP:
jmp 0.l
@@:
cmpi.w #5,d2 * KEY B.
beq MSL_LL
bra MS_LIMIT_JMP
MSL_LL:
movem.l d1/a0,-(sp)
lea Data2(pc),a0
moveq #0,d0
btst #0,(a0)
beq @f
ori.l #$FF000000,d0
@@: btst #1,(a0)
beq @f
ori.l #$00FF0000,d0
@@: moveq #0,d1
move.b 1(a0),d1
lsl.l #8,d1
or.w d1,d0
move.b 2(a0),d0
move.b #-1,3(a0)
clr.b 1(a0) *移動量はクリア
clr.b 2(a0)
*clr.l (a0)
movem.l (sp)+,d1/a0
rts
Data2: .dc.l 0 *MS_LIMIT戻り値用
*読んだら +3.bを-1に!
.even
KeyMode:
.dc.w 0
TIMC_C1:
.dc.w 0
TIMC_C2:
.dc.w 0
EndStatio:*******************常駐部
MarkerChk:*----------------------------------------
* a0 アドレス
*
*[戻り値] bne ちがう
* beq あっている
cmpa.l #$F0000000,a0
bcc @f
cmp.l #HEAD1,(a0)
bne @f
cmp.l #HEAD2,4(a0)
bne @f
cmpa.l a0,a0 *z=1
@@:
rts
InvChk:*----------------------------------------
* a0.l==なら非常駐
* a0.l!=なら常駐
movea.l (a0),a0 *一つ前のポインタ
cmpa.l #$F0000000,a0
bcc IC1
cmp.l #HEAD1,$0104(a0)
bne @f
cmp.l #HEAD2,$0108(a0)
bne @f
adda.w #$100,a0 **[SS]のポインタ
rts
@@: **違う
tst.l (a0) *一つ前のポインタ
bne InvChk *0でない(上へ)
IC1: sub.l a0,a0 *非常駐
rts
AtoI:*----------------------------------------
* a2 アドレス
*[戻り値] d0.l 数字
moveq #0,d0
@@: move.b (a2)+,d2
subi.b #'0',d2
bcs AIr
cmpi.b #9,d2
bhi AIr
andi.l #$0000FF,d2
mulu #10,d0
add.l d2,d0
bra @b
AIr: subq #1,a2
rts
init:*------------------------------------------------------------------
pea LR1(pc)
DOS _PRINT
addq.w #4,sp
** 常駐チェック **
suba.l a1,a1
SUPER
movea.l d0,a1
moveq #0,d1
bsr InvChk
movea.l a0,a3 *常駐先頭アドレス
movea.l MSD_,a0
suba #MSD-head,a0
bsr MarkerChk
bne @f
bset #0,d1
@@:
movea.l MFP_,a0
suba #MFP-head,a0
bsr MarkerChk
bne @f
bset #1,d1
@@:
movea.l MS_SEL_,a0
suba #MS_SEL-head,a0
bsr MarkerChk
bne @f
bset #2,d1
@@:
movea.l MS_LIMIT_,a0
suba #MS_LIMIT-head,a0
bsr MarkerChk
bne @f
bset #3,d1
@@:
movea.l TIMC_,a0
suba #TIMC-head,a0
bsr MarkerChk
bne @f
bset #4,d1
@@:
movea.l IOCS5_,a0
suba #IOCS5-head,a0
bsr MarkerChk
bne @f
bset #5,d1
@@:
*d1に常駐状態
USER
** 常駐していたらそのデータを引用 **
move.l a3,d0
beq conl
move.w KeyMode-SS(a3),KeyMode
* move.w Port-SS(a3),Port
* move.w TccL-SS(a3),TccL
* move.b T25L-SS(a3),T25L
conl: ** コマンドラインチェック **
tst.b (a2)+ *スキップ
sw: move.b (a2)+,d0
beq keep
cmpi.b #' ',d0
beq sw
cmpi.b #$09,d0 *tab
beq sw
cmpi.b #'-',d0
beq swc
cmpi.b #'/',d0
beq swc
swe: pea LR6(pc)
bra PE *end
swc: **スイッチ判断
move.b (a2)+,d0
beq swe
cmpi.b #'?',d0
beq help
ori.b #$20,d0 *小文字化!
cmpi.b #'r',d0
beq free
cmpi.b #'p',d0
beq pswc
swcerr: pea LR7(pc)
bra PE *end
pswc:******************
bsr AtoI
cmpi.w #$0004,d0
bcc swcerr
*move.w d0,Port
bra sw
help:******************
pea LRH(pc)
bra PE *end
keep: ************************** 常駐させる
move.l a3,d0
beq @f
*既に常駐、設定変更
move.w KeyMode(pc),KeyMode-SS(a3)
* move.w Port(pc),Port-SS(a3)
* move.w TccL(pc),TccL-SS(a3)
* move.b T25L(pc),T25L-SS(a3)
bsr keepsub
pea LR5(pc)
bra PE *end
@@:
**セット
suba.l a1,a1
SUPER
move.l d0,a1
move.l MSD_,MSD_JMP+2
lea MSD-SS(a4),a0
move.l a0,MSD_
move.l MFP_,MFP_JMP+2
lea MFP-SS(a4),a0
move.l a0,MFP_
move.l MS_SEL_,MS_SEL_JMP+2
lea MS_SEL-SS(a4),a0
move.l a0,MS_SEL_
move.l MS_LIMIT_,MS_LIMIT_JMP+2
lea MS_LIMIT-SS(a4),a0
move.l a0,MS_LIMIT_
move.l TIMC_,d0
move.l d0,TIMC_JMP+2
lea TIMC-SS(a4),a0
move.l a0,TIMC_
move.l IOCS5_,d0
move.l d0,IOCS5_JMP+2
lea IOCS5-SS(a4),a0
move.l a0,IOCS5_
USER
bsr keepsub
pea LRKP(pc)
DOS _PRINT
addq #4,sp
clr.w -(sp)
move.l #EndStatio-StartStatio,-(sp)
DOS _KEEPPR
****************
keepsub:
IOCS _MS_INIT
pea.l LR2(pc)
DOS _PRINT
addq #4,sp
rts
free: *****************************常駐解除
move.l a3,d0
bne @f
pea LR8(pc) **非常駐
bra PE *end
@@:
cmpi.w #$3F,d1
beq @f
pea LR4(pc) **ベクタが占領
bra PE *end
@@:
tst.w KeyMode
beq @f
pea LRMM(pc)
bra PE *end
@@:
suba.l a1,a1
SUPER
movea.l d0,a1
move.l (MSD_JMP-SS)+2(a3),MSD_
move.l (MFP_JMP-SS)+2(a3),MFP_
move.l (MS_SEL_JMP-SS)+2(a3),MS_SEL_
move.l (MS_LIMIT_JMP-SS)+2(a3),MS_LIMIT_
move.l (TIMC_JMP-SS)+2(a3),TIMC_
move.l (IOCS5_JMP-SS)+2(a3),IOCS5_
USER
sub.l #$00000F0,a3
move.l a3,-(sp)
DOS _MFREE
addq #4,sp
pea LR3(pc)
PE: DOS _PRINT
addq.w #4,sp
DOS _EXIT
LR2: .dc.b ' KEY BOURD で MOUSE エミュが出来ます。',$0d,$0a
.dc.b ' [SHIFT]+[かな]で MOUSE エミュモードになります。',$0d,$0a,0
LRKP: .dc.b ' 常駐しました。',$0d,$0a,0
LR3: .dc.b ' 常駐解除しました。',$0d,$0a,0
LR4: .dc.b ' ベクタが占領されています。',$0d,$0a,0
LR5: .dc.b ' 設定を変更しました。',$0d,$0a,0
LR5_: .dc.b ' 既に常駐しています。',$0d,$0a,0
LR6: .dc.b ' コマンドラインが異常です。',$0d,$0a,0
LR7: .dc.b ' スイッチが異常です。',$0d,$0a,0
LR8: .dc.b ' 常駐していません。',$0d,$0a,0
LRMM: .dc.b ' MOUSE エミュ中です。常駐解除出来ません。',$0d,$0a,0
*LRMf: .dc.b ' チェック中他の割り込みを止めません。',$0d,$0a,0
LRH:
.dc.b $0d,$0a
.dc.b '使用法:KBMOUSE.x [switch]',$0d,$0a
.dc.b ' /R ・・・・ 常駐解除します。',$0d,$0a
.dc.b $0d,$0a,0
.even
LR1: dc.b 'X68k KEY BOURD MOUSE EMULATER Version 0.01 Copyright 1997 TNB製作所',$0d,$0a,0
.even